//
// Vector.hpp for  in ~/Dropbox/Projets/raytracer-2016/Includes/Maths/
//
// Made by Jonathan
// Login   <ledey_l@epitech.net>
//
// Started on  Fri Sep 20 22:01:43 2013 Jonathan
// Last update Tue Sep 24 20:08:49 2013 Jonathan
//

#ifndef			VECTOR_HPP_
# define		VECTOR_HPP_

# include		<cmath>

namespace		Maths
{
  class			Normal;
  class			Point;
  class			Matrix;

  class			Vector
  {
  private:
    long double		mX;
    long double		mY;
    long double		mZ;

  protected:

  public:
    Vector(void);
    Vector(long double rValue);
    Vector(long double rX, long double rY, long double rZ);
    Vector(Vector const &rOther);
    Vector(Normal const &rNormal);
    Vector(Point const &rPoint);
    Vector		&operator=(Vector const &rOther);
    Vector		&operator=(Normal const &rNormal);
    Vector		&operator=(Point const &rNormal);
    ~Vector(void);

    Vector		operator-(void) const;
    Vector		operator+(Vector const &rOther) const;
    Vector		&operator+=(Vector const &rOther);
    Vector		operator-(Vector const &rOther) const;
    Vector		&operator-=(Vector const &rOther);
    Vector		operator*(long double rValue) const;
    long double		operator*(Vector const &rOther) const;
    Vector		operator/(long double rValue) const;
    Vector		operator^(Vector const &rOther) const;
    long double		operator[](int rIndex) const;
    long double		Length(void) const;
    long double		Length_Squared(void) const;
    void		Normalize(void);
    Vector		&Hat(void);
  };

  Vector		operator*(long double rValue, Vector const &rVector);
  Vector		operator*(Matrix const &rMatrix, Vector const &rVector);
};

#endif			/* VECTOR_HPP_ */
